#include <stdio.h> 
#include <stdlib.h> 
#include <assert.h> 

inline void* aligned_malloc(size_t size, size_t alignment)  
{  
    // 检查alignment是否是2^N  
    assert(!(alignment & (alignment - 1)));  
    // 计算出一个最大的offset，sizeof(void*)是为了存储原始指针地址  
    size_t offset = sizeof(void*) + (--alignment);  
	printf("offset %lu\n", offset);
   
    // 分配一块带offset的内存  
    char* p = static_cast<char*>(malloc(offset + size));  
    if (!p) return nullptr;  
    
    printf("p %p\n", (void *)p);

    // 通过“& (~alignment)”把多计算的offset减掉  
    void* r = reinterpret_cast<void*>(reinterpret_cast<size_t>(p + offset) & (~alignment));  
    printf("r %p\n", (void *)r);
    // 将r当做一个指向void*的指针，在r当前地址前面放入原始地址  
    static_cast<void**>(r)[-1] = p;  
    // 返回经过对齐的内存地址  
    return r;  
}

int main(int argc, char **argv) {

    aligned_malloc(10 , 4);
    aligned_malloc(7 , 4);
    aligned_malloc(8 , 4);
    aligned_malloc(9 , 8);

    return 0;
}
